#ifndef VECTOR_H
#define VECTOR_H

#include <math.h>
#include <iostream>
using namespace std;

class Vector{

	public:

		/* Constructor por defecto */
		Vector();

		/* Constructor que toma las coordenadas */
		Vector(double& _x, double& _y, double& _z);
		Vector(double _x, double _y, double _z);

		/* Constructor que toma los angulo th y phi donde 
		 * th = angulo en el plano xy
		 * phi = angulo en z 			*/
		Vector(double& th, double& phi);
		Vector(double th, double phi);

		/* Devuelve la norma del vector */
		double norm() const;

		/* devuelve el mismo vector pero normalizado */
		Vector normalize() const;

		/* Devuelve la inversa del vector */
		Vector inverse() const;

		/* Se fija si dos vectores son muy parecidos segun un umbral l */
		bool near(const Vector& v, const double& l);

		/* refleja un vector con respecto a una normal N */
		Vector reflect(const Vector& N) const;

		/* calcula la direccion del vector refractado segun la normal N 
		 * y los indices de refraccion n0 y n1 cuando pasa de n0 a n1 */
		Vector refract(const Vector& N, const double& n0, const double& n1) const;

		/* Operadores */

		Vector operator + (const Vector& b) const;
		void operator += (const Vector& b);

		void operator - ();
		Vector operator - (const Vector& b) const;
		void operator -= (const Vector& b);

		Vector operator * (const double& n) const;
		void operator *= (const double& n);
		friend Vector operator * (const double& n, const Vector& v);

		Vector operator / (const double& n) const;
		void operator /= (const double& n);

		/* Producto interno */
		double operator * (const Vector& b) const;

		/* Producto cruz */
		Vector operator ^ (const Vector& b) const;

		friend ostream& operator << (ostream& os, const Vector& v);

	private:

		double x;
		double y;
		double z;

};

Vector operator * (const double& n, const Vector& v);

ostream& operator << (ostream& os, const Vector& v);

#endif
